{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "textrank4zh模块是针对中文文本的TextRank算法的python算法实现。  \n",
    "util.py:TextRank算法的核心思想在该文件中实现。  \n",
    "Segmentation.py:包含用于分词和分句的类。  \n",
    "TextRank4Keyword.py:包含用于提取关键词和关键词组的类。  \n",
    "   - 初始化函数，可以传递停用词文件路径，词性列表，用于拆分句子的分隔符，默认为`?!;？！。；...\\n`\n",
    "   - analyze函数，分析文本的函数\n",
    "     - text：文本内容\n",
    "     - window：窗口大小，用于构造单词之间的边，默认值为2\n",
    "     - lower: 是否将英文文本转换为小写，默认值为False\n",
    "\t - vertex_source: 选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来构造pagerank对应的图中的节点。默认值为`'all_filters'`，可选值为`'no_filter', 'no_stop_words', 'all_filters'`。关键词也来自`vertex_source`\n",
    "\t - edge_source:选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来构造pagerank对应的图中的节点之间的边。默认值为`'no_stop_words'`，可选值为`'no_filter', 'no_stop_words', 'all_filters'`。边的构造要结合`window`参数。\n",
    "     - pagerank_config:pagerank算法参数配置，阻尼系数为0.85\n",
    "   - get_keywords，获取最重要的num个长度大于等于word_min_len的关键词\n",
    "     - num：返回的关键词个数\n",
    "     - word_min_len:最小关键词长度\n",
    "     - return：关键词列表\n",
    "   - get_keyphrases，获取 keywords_num 个关键词构造的可能出现的短语，要求这个短语在原文本中至少出现的次数为min_occur_num\n",
    "     - keywords_num: 返回的关键词短语个数\n",
    "     - min_occur_num: 短语在文本中的最小出现次数\n",
    "     - return: 关键词短语列表  \n",
    "TextRank4Sentence.py:包含用于提取关键句的类  \n",
    "   - 初始化函数，可以传递停用词文件路径，用于拆分句子的分隔符，默认为`?!;？！。；...\\n`\n",
    "   - analyze函数，分析文本的函数\n",
    "     - text：文本内容\n",
    "     - lower: 是否将英文文本转换为小写，默认值为False\n",
    "\t  - source： 选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来生成句子之间的相似度。默认值为`'all_filters'`，可选值为`'no_filter', 'no_stop_words', 'all_filters'`。\n",
    "     - sim_func：指定计算句子相似度的函数。\n",
    "   -  get_key_sentences，获取最重要的num个长度大于等于sentence_min_len的句子用来生成摘要。\n",
    "      - num：获取多少个句子\n",
    "      - sentence_min_len=6：句子最小长度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-11-07T08:35:19.942007Z",
     "start_time": "2020-11-07T08:35:18.779940Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "关键词：\n",
      "高考 0.0561910284818324\n",
      "考生 0.04229947253711349\n",
      "中学 0.01564725882438625\n",
      "厂镇 0.015270437153080206\n",
      "坦厂 0.01342788926095217\n",
      "考试 0.012890430450963762\n",
      "毛坦 0.012374789433256666\n",
      "安徽 0.011541890740988228\n",
      "家长 0.011021388113493073\n",
      "复读 0.009964606550782447\n",
      "公布 0.009526883500013196\n",
      "安徽省 0.009371202810728618\n",
      "学习 0.009365336245696737\n",
      "今年 0.009159295458997335\n",
      "疫情 0.009046585114833387\n",
      "分数线 0.008944006764594772\n",
      "往年 0.008639663883681153\n",
      "学生 0.008604230147317472\n",
      "六安市 0.008495570132677311\n",
      "人数 0.008493922897178584\n"
     ]
    }
   ],
   "source": [
    "#获取文本的关键词\n",
    "#-*- encoding:utf-8 -*-\n",
    "from textrank4zh import TextRank4Keyword\n",
    "\n",
    "text = open('./news_高考.txt', encoding='utf-8').read()\n",
    "\n",
    "tr4w = TextRank4Keyword()\n",
    "\n",
    "\"\"\"\n",
    "\t\t:param text: 文本内容\n",
    "\t\t:param window: 窗口大小，整型，用于构造单词之间的边，去默认值为2\n",
    "\t\t:param lower: 是否将英文文本转换为小写，默认值为False\n",
    "\t\t:param vertex_source: 选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来构造pagerank对应的图中的节点。默认值为`'all_filters'`，可选值为`'no_filter', 'no_stop_words', 'all_filters'`。关键词也来自`vertex_source`\n",
    "\t\t:param edge_source:选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来构造pagerank对应的图中的节点之间的边。默认值为`'no_stop_words'`，可选值为`'no_filter', 'no_stop_words', 'all_filters'`。边的构造要结合`window`参数。\n",
    "\t\t:param pagerank_config:pagerank算法参数配置，阻尼系数为0.85\n",
    "\"\"\"\n",
    "tr4w.analyze(text=text, lower=True, window=3)\n",
    "print('关键词：')\n",
    "\n",
    "\"\"\"获取最重要的num个长度大于等于word_min_len的关键词\"\"\"\n",
    "for item in tr4w.get_keywords(20, word_min_len=2):\n",
    "    print(item.word, item.weight)\n",
    "\n",
    "# \"\"\"获取 keywords_num 个关键词构造的可能出现的短语，要求这个短语在原文本中至少出现的次数为min_occur_num\"\"\"\n",
    "#def get_keyphrases(self, keywords_num=12, min_occur_num=2):\n",
    "# \"\"\"\n",
    "# :param keywords_num: 返回的关键词短语个数\n",
    "# :param min_occur_num: 短语在文本中的最小出现次数\n",
    "# :return: 关键词短语列表\n",
    "# \"\"\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2020-11-07T08:36:12.112991Z",
     "start_time": "2020-11-07T08:36:11.033929Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "摘要：\n",
      "4 0.06799640479282443 7月23日，毛坦厂中学所在的安徽六安市毛坦厂镇官方发布喜报称，根据网络查询，六安市毛坦厂中学、金安高级中学、金安中学补习班2020年高考再创佳绩，再传捷报，安徽籍考生（不含外省考生）本科达线人数10176人，其中600分以上600分以上290人，理科最高分674分，文科最高分608分\n",
      "12 0.06192582599548609 据悉，毛坦厂镇面积只有3.5平方公里，人口不过万余人，从1999年后，毛坦厂中学借高考复读声名鹊起，每年都要吸引2万多学生和1万多陪读家长，整个小镇接近5万人\n",
      "15 0.05979224551975722 在高考前，为了保障高考的顺利进行，高考镇实行了史上最严的“封锁”，在疫情开始之初，通往毛坦厂镇的所有道路都被切断，4月初，安徽省境内高三年级开始复课之后，因为外来复读学生较多，毛坦厂镇曾经短暂对外地家长和考生开放了几天，随之又实行严格管控，一直到7月5日考生离开高考镇时才解封\n",
      "['7月23日，毛坦厂中学所在的安徽六安市毛坦厂镇官方发布喜报称，根据网络查询，六安市毛坦厂中学、金安高级中学、金安中学补习班2020年高考再创佳绩，再传捷报，安徽籍考生（不含外省考生）本科达线人数10176人，其中600分以上600分以上290人，理科最高分674分，文科最高分608分', '据悉，毛坦厂镇面积只有3.5平方公里，人口不过万余人，从1999年后，毛坦厂中学借高考复读声名鹊起，每年都要吸引2万多学生和1万多陪读家长，整个小镇接近5万人', '在高考前，为了保障高考的顺利进行，高考镇实行了史上最严的“封锁”，在疫情开始之初，通往毛坦厂镇的所有道路都被切断，4月初，安徽省境内高三年级开始复课之后，因为外来复读学生较多，毛坦厂镇曾经短暂对外地家长和考生开放了几天，随之又实行严格管控，一直到7月5日考生离开高考镇时才解封']\n"
     ]
    }
   ],
   "source": [
    "#获取文本的关键句\n",
    "from textrank4zh import TextRank4Sentence\n",
    "\n",
    "text = open('./news_高考.txt', encoding='utf-8').read()\n",
    "\n",
    "# 输出重要的句子\n",
    "tr4s = TextRank4Sentence()\n",
    "\n",
    "\"\"\"\n",
    "Keyword arguments:\n",
    "text                 --  文本内容，字符串。\n",
    "lower                --  是否将文本转换为小写。默认为False。\n",
    "source               --  选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来生成句子之间的相似度。\n",
    "\t\t\t\t\t\t 默认值为`'all_filters'`，可选值为`'no_filter', 'no_stop_words', 'all_filters'`。\n",
    "sim_func             --  指定计算句子相似度的函数。\n",
    "\"\"\"\n",
    "tr4s.analyze(text=text, lower=True, source='all_filters')\n",
    "print('摘要：')\n",
    "\n",
    "#获取最重要的num个长度大于等于sentence_min_len的句子用来生成摘要。\n",
    "#def get_key_sentences(self, num=6, sentence_min_len=6):\n",
    "\n",
    "summary=[]\n",
    "# 重要性较高的三个句子,句子最小长度为6\n",
    "for item in tr4s.get_key_sentences(num=3, sentence_min_len=6):\n",
    "    # index是语句在文本中位置，weight表示权重，sentence表示句子的内容\n",
    "    print(item.index, item.weight, item.sentence)\n",
    "    summary.append(item.sentence)\n",
    "print(summary)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.2"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
